local process = Process("test1")

function process:onStart()
    -- 创建基地
    Unit(Player(5),TPL_UNIT.Base,0,-2496,270)

    -- 创建英雄 给4个玩家创建英雄
    for i=1,4,1 do
        local p = Player(i) 
        -- 如果玩家还在玩
        if(p:isPlaying()) then 
            -- 创建英雄
            local u = Unit(p,TPL_UNIT.Hero,0,-2496+250,90)
            u:reborn(10) --10秒复活时间
        end
    end


    -- 刷怪波次的管理
    -- 最多刷多少波
    local cur = 1 --当前第几波
    local wave = 3  --总共100波
    local period = 10  --每隔50秒刷新一波怪

    -- 每波小怪的数量
    local qty = 6

    -- 小怪所属玩家 小怪作为一个队伍管理
    local enemyTeam = Team("敌人",13,true,true) 
    enemyTeam:members({10,11,12})

    -- 出怪地点
    local points = {
        { 0, 2432, 270 }, -- 中
        { -2740, -2496, 0 }, -- 左
        { 2561, -2496, 180 }, -- 右
    }

     
    -- 刷n波 50秒后刷新第一波怪
    local enemyTimer = time.setInterval(period,function(curTimer1) 
        -- 是否刷到最大波数
        if(cur >= wave) then 
            class.destroy(curTimer1)
            return 
        end
        -- 每波刷新6个小怪
        local i = 0 
        time.setInterval(1,function(curTimer) 
            -- 检查是否刷新了6个小怪
            if(i >= qty)then
                class.destroy(curTimer)
                return
            end
            -- 刷新小怪
            for index, point in ipairs(points) do
                local u = Unit(enemyTeam,TPL_UNIT.Enemy,point[1],point[2],point[3])
                -- 小怪攻击基地
                u:orderAttack(0,-2496)
            end
            -- 增加一个小怪个数统计
            i  = i + 1
        end)
        -- 记录第几波
        cur = cur + 1
    end)
    -- 刷怪倒计时UI
    local ui = UIText("enemyTimer",UIGame)
        :relation(UI_ALIGN_TOP,UIGame,UI_ALIGN_TOP,0,-0.07)
        :textAlign(TEXT_ALIGN_CENTER)
        :fontSize(12)
    time.setInterval(1,function() 
        -- enemyTimer:remain() 获取倒计时剩下时间
        -- math.floor() 取整
        ui:text("第"..cur.."波:"..math.floor(enemyTimer:remain()))
    end)  
    
    -- 练功房
    -- 1. 传送门 2. 单独的刷怪房间
    local brushes = {
        {
            name = "刷经验",
            -- 传送门
            region = { -800, -1800, 150, "ReplaceableTextures\\Splats\\FlameStrike2.blp" },
            -- 房间的坐标
            room = { -2270, 2221, 180 },

            p_num = 0,
            e_num = 0,
        },
        {
            name = "刷金币",
            -- 传送门
            region = { 800, -1800, 150, "ReplaceableTextures\\Splats\\DarkSummonSpecial.blp" },
            -- 房间的坐标
            room = { 2426, 2178, 0 },
            -- 房间玩家的数量
            p_num = 0,
            -- 房间怪物的数量 每一波刷5个怪
            e_num = 0,
        }
    }
    -- 2. 单位传送到房间
    local trans = function(unit,brush) 
        -- 练功房的房间坐标
        local room = brush.room 
        -- 移动单位到房间坐标
        unit:position(room[1],room[2])
        unit:facing(room[3])
        -- 修改镜头位置
        camera.to(room[1],room[2],0)

        -- 记录单位与房间的关系
        unit._brush = brush 
        brush.p_num = brush.p_num + 1

        -- 房间定时器刷怪 
        -- 检查计时器是否已创建
        if(brush.timer == nil) then
            brush.timer =  time.setInterval(2,function() 
                if(brush.e_num <= 0) then
                    for _ = 1, 5 do
                        local u = Unit(enemyTeam,TPL_UNIT.Enemy,
                            room[1],room[2],270)
                        -- 标记小怪的类型
                        u._kind = brush.name 
    
                        u:hp(10)
                        u:attack(10)
                    end
                    -- 统计小怪数量
                    brush.e_num = brush.e_num + 5
                end
            end)
        end
    end

    -- 3. 注册小怪死亡事件 奖励单位经验/金币/道具
    event.syncRegister(UnitClass,eventKind.unitDead,"enemyDrop",function (evtData)
        -- 获取触发事件的单位 这里就是小怪
        local tu = evtData.triggerUnit 

        if(tu._kind == '刷金币')then
            brushes[2].e_num = brushes[2].e_num - 1
            if(evtData.killerUnit) then
                evtData.killerUnit:owner():worth("+",{gold = 1})
            end
        elseif(tu._kind == '刷经验')then
            brushes[1].e_num = brushes[1].e_num - 1
            if(evtData.killerUnit) then
                evtData.killerUnit:exp("+=100")
            end
        end
    end)
    

    -- 1. 创建传送门
    for i, brush in ipairs(brushes) do
        -- 传送门的名称 使用漂浮文字
        ttg.permanent(brush.region[1],brush.region[2],brush.name,{zOffset = 150})

        -- 传送门 使用一个区域Region 一旦玩家进入这个区域 就传送到对应的房间
        local r = Region(
                brush.name,"square",
                brush.region[1],brush.region[2],brush.region[3],brush.region[3]
            )

        -- 传送门的地面纹理
        r:splat(brush.region[4],200)

        -- 单位进入区域传送到房间
        r:onEnter(function (evtData)
            local u = evtData.triggerUnit 
            -- 检查这个单位是否属于电脑玩家的小怪
            if(u:owner():isComputer()) then
                return
            end
            trans(u,brush)
        end)
    end

    -- 注册一个回城命令 -hg
    player.onChat("-hg", function(evtData)
        local idx = evtData.triggerPlayer:index()
        ---@type Unit
        local hero = bubble["hero" .. idx]
        hero:position(0, -2300)
        hero:facing(270)
        camera.to(0, -2300, 0)
        local brush = hero._brush
        if (nil ~= brush) then
            hero._brush = nil
            brush.p_num = brush.p_num - 1
            if (brush.p_num <= 0) then
                class.destroy(brush.timer)
                brush.timer = nil
            end
        end
    end)
    -- 注册热更新命令
    player.command("^-proc [a-zA-Z0-9_]+$", function(evtData)
        local p = string.trim(evtData.matchedString)
        p = string.sub(p, 7, string.len(p))
        local proc = nil
        if (p == "this") then
            proc = ProcessCurrent
        else
            proc = Process(p)
        end
        if (class.isObject(proc, ProcessClass)) then
            print(p .. "流程已重置")
            ProcessCurrent:over()
            proc:start()
        end
    end)
end
